home *** CD-ROM | disk | FTP | other *** search
/ Die Ultimative Software-P…i Collection 1996 & 1997 / Die Ultimative Software-Pakete CD-ROM fur Atari Collection 1996 & 1997.iso / i / internet / software / tuwtcpsr / queue.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-03-19  |  5.2 KB  |  298 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <tos.h>
  5. #include "queue.h"
  6. #include "mbuf.h"
  7. #include "cookie.h"
  8.  
  9. #include "nettrace.h"
  10.  
  11. #define noDEBUG
  12. #ifndef FALSE
  13. #define FALSE 0
  14. #define TRUE !FALSE
  15. #endif
  16. #ifdef DEBUG
  17. static char str[100];
  18. #endif
  19. extern long q_disint(void);
  20. extern long q_enabint(void);
  21. extern long p_disint(void);
  22. extern long p_enabint(void);
  23.  
  24. TCP_QUEUE *q_init(TCP_QUEUE *q,char *buf,long s)
  25. {
  26.     if(!q)
  27.     {
  28.         q = (TCP_QUEUE *)getmem(sizeof(TCP_QUEUE));
  29.     }
  30.     if(q)
  31.     {
  32.         q->wr = 0;
  33.         q->rd = 0;
  34.         q->size = s;
  35.         if(!buf)
  36.         {
  37.             q->data = (unsigned char *)getmem(s);
  38.             q->flags = TRUE;
  39.         }
  40.         else
  41.         {
  42.             q->data =(unsigned char *)buf;
  43.             q->flags = FALSE;
  44.         }
  45.     }
  46.     return(q);
  47. }
  48.  
  49. long q_look(TCP_QUEUE *q,int c)
  50. {
  51.   register long i,ret;
  52.  
  53.   if(!q_used(q)) return(-1);
  54.  
  55.   q_disint();
  56.  
  57.   if(q->wr > q->rd)
  58.   {
  59.     for(i=q->rd; i<q->wr; i++)
  60.       if(q->data[i] == c)
  61.       {
  62.        ret = (i-q->rd);
  63.        q_enabint();
  64.        return ret;
  65.       }
  66.   }
  67.   else
  68.   {
  69.     for(i=q->rd; i<q->size; i++)
  70.       if(q->data[i] == c)
  71.       {
  72.        ret = (i-q->rd);
  73.        q_enabint();
  74.        return ret;
  75.       }
  76.     for(i=0; i<q->wr; i++)
  77.       if(q->data[i] == c)
  78.       {
  79.        ret = (i+q->size-q->rd);
  80.        q_enabint();
  81.        return ret;
  82.       }
  83.   }
  84.   q_enabint();
  85.   return(-1);
  86. }
  87.  
  88. long q_get(TCP_QUEUE *q,unsigned char *p,long len, long offs)
  89. {
  90.   register long l;
  91.   if(!len) return(0);
  92.  
  93.   q_disint();
  94.   
  95.   offs = (offs + q->rd) % q->size;        /* wrap around */
  96. #ifdef DEBUG
  97. sprintf(str," qget: at %lx offs %ld %ld bytes [%02x]\n",&q->data[offs],offs,len,*(char*)&q->data[offs]);
  98. TRACE(str);
  99. #endif
  100.   if(offs < q->wr)
  101.   {
  102.     if((q->wr - offs) < len) len = q->wr - offs;
  103.     if(len)
  104.     {
  105.       memcpy((char *)p,(char *)&q->data[offs],(size_t)len);
  106.     }
  107.   }
  108.   else
  109.   {
  110.     l= q->size - offs;
  111.     if((l + q->wr) < len) len = l + q->wr;
  112.     if(len < l) l=len;
  113.     if(l)        memcpy((char *)p,(char *)&q->data[offs],(size_t)l);
  114.     if(len - l > 0)    memcpy((char *)p+l,(char *)q->data,(size_t)(len-l));
  115.   }
  116.   q_enabint();
  117.   return(len);
  118. }
  119.  
  120. long q_put(TCP_QUEUE *q,unsigned char *p,long len)
  121. {
  122.   register long l;
  123.   q_disint();
  124.  
  125.   if(!len || ((q->wr+1) % q->size == q->rd) )
  126.   {
  127.     q_enabint();
  128.     return(0);
  129.   }
  130. #ifdef DEBUG
  131. sprintf(str," qput: at %lx %ld bytes [%02x]\n",&q->data[q->wr],len,*(char*)p);
  132. TRACE(str);
  133. #endif
  134.   if(q->wr < q->rd-1)
  135.   {
  136.     if((q->rd - q->wr - 1) < len) len = q->rd - q->wr - 1;
  137.     if(len)
  138.     {
  139.       memcpy((char *)&q->data[q->wr],(char *)p,(size_t)len);
  140.       q->wr += len;
  141.     }
  142.   }
  143.   else
  144.   {
  145.     l= q->size - q->wr;
  146.     if((l + q->rd - 1) < len) len = l + q->rd - 1;
  147.     if(len < l) l=len;
  148.     if(l)        memcpy((char *)&q->data[q->wr],(char *)p,(size_t)l);
  149.     if(len - l > 0)    memcpy((char *)q->data,(char *)p+l,(size_t)(len-l));
  150.     q->wr += len;
  151.     if(q->wr >= q->size) q->wr -= q->size;
  152.   }
  153.   q_enabint();
  154.   return(len);
  155. }
  156.  
  157. long q_rem(TCP_QUEUE *q,long len)
  158. {
  159.   register long l;
  160.  
  161.   if(!len) return(0);
  162.   q_disint();
  163.  
  164.   if(q->rd < q->wr)
  165.   {
  166.     if((q->wr - q->rd) < len) len = q->wr - q->rd;
  167.     q->rd += len;
  168.   }
  169.   else
  170.   {
  171.     l= q->size - q->rd;
  172.     if((l + q->wr) < len) len = l + q->wr;
  173.     q->rd += len;
  174.     if(q->rd >= q->size) q->rd -= q->size;  /* wrap around */
  175.   }
  176.   q_enabint();
  177.   return(len);
  178. }
  179.  
  180. /* IP-packet-queue routines */
  181.  
  182. int ip_q_del(TCP_QUEUE *q)
  183. {
  184.     if(!q) return(TRUE);
  185.     p_disint();
  186.     if(q->data && q->flags)
  187.     {
  188.         freemem(q->data);
  189.         q->data = NULL;
  190.         q->size = 0;
  191.         q->rd=0;
  192.         q->wr=0;
  193.         p_enabint();
  194.         return(TRUE);
  195.     }
  196.     p_enabint();
  197.     return(FALSE);
  198. }
  199.  
  200. PKTQUEUE *ip_q_create(int nbuf,int bufsize)
  201. {
  202. PKTQUEUE *q;
  203. int      i;
  204.  
  205.     q = (PKTQUEUE *)getmem(sizeof(PKTQUEUE)+(nbuf-1)*sizeof(struct q_table));
  206.     if(!q) return(NULL);
  207.     q->q_get = q->q_put = 0;
  208.     q->q_nbuf = nbuf;
  209.     for(i=0; i<nbuf; i++)
  210.     {
  211.         if(bufsize)
  212.         {
  213.             q->q_tab[i].q_occupied = TRUE;
  214.             q->q_tab[i].q_pkt = (PACKET *)getmem((size_t)bufsize);
  215.             if(!q->q_tab[i].q_pkt)
  216.             {
  217.                 ip_q_delete(q);
  218.                 return(NULL);
  219.             }
  220.         }
  221.         else
  222.             q->q_tab[i].q_occupied = FALSE;
  223.     }
  224.     return(q);
  225. }
  226.  
  227. int ip_q_delete(PKTQUEUE *q)
  228. {
  229. int        i;
  230.     if(!q) return(FALSE);
  231.     for(i=0; i< q->q_nbuf; i++)
  232.     {
  233.         if(q->q_tab[i].q_occupied && q->q_tab[i].q_pkt)
  234.             free(q->q_tab[i].q_pkt); 
  235.     }    
  236.     free(q);
  237.     return(TRUE);
  238. }
  239.  
  240.  
  241. PACKET *ip_aq_getpkt(PKTQUEUE *q)
  242. {
  243. PACKET *pkt;
  244.     p_disint();
  245.     pkt=ip_q_getpkt(q);
  246.     p_enabint();
  247.     return(pkt);
  248. }
  249.  
  250.  
  251. PACKET *ip_q_getpkt(PKTQUEUE *q)
  252. {
  253. register int i;
  254.  
  255.     if(!q) return(NULL);
  256.     i = q->q_get;
  257.     if(!q->q_tab[i].q_occupied) return(NULL);
  258.     q->q_get++;
  259.     if(q->q_get >= q->q_nbuf) q->q_get = 0;
  260.     q->q_tab[i].q_occupied = FALSE;
  261.     return(q->q_tab[i].q_pkt);
  262. }
  263.  
  264. int ip_aq_putpkt(PKTQUEUE *q,PACKET *pkt)
  265. {
  266. int r;
  267.     p_disint();
  268.     r=ip_q_putpkt(q,pkt);
  269.     p_enabint();
  270.     return(r);
  271. }
  272.  
  273.  
  274. int ip_q_putpkt(PKTQUEUE *q,PACKET *pkt)
  275. {
  276. register int i;
  277.  
  278.     if(!q) return(FALSE);
  279.     i = q->q_put;
  280.     
  281. #ifdef DEBUG
  282. Bconout(2,'Q');
  283. #endif
  284.  
  285.     if(q->q_tab[i].q_occupied)
  286.     {
  287. #ifdef DEBUG
  288. printf("put_queue: occupied\n");
  289. #endif
  290.         return(FALSE);
  291.     }
  292.     q->q_put++;
  293.     if(q->q_put >= q->q_nbuf) q->q_put = 0;
  294.     q->q_tab[i].q_pkt = pkt;
  295.     q->q_tab[i].q_occupied = TRUE;
  296.     return(TRUE);
  297. }
  298.